package br.trainee.web.listener;

import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.json.simple.JSONObject;

import br.trainee.web.util.UtilFuncoes;

@WebListener
public class RequestListener implements ServletRequestListener {

	@Override
	public void requestDestroyed(ServletRequestEvent evento) {
		
		
	}

	@Override
	public void requestInitialized(ServletRequestEvent evento) {

		HttpServletRequest request = (HttpServletRequest) evento.getServletRequest();
		
		HttpSession sessao = request.getSession();
		
		Map<String,String> mapaLinguagem = null;
		JSONObject mapaLinguagemJson = null;
		
		//Quando o usuário já tiver clicado na bandeira de linguagem. Neste caso será priorizado a bandeira selecionada
		if(sessao.getAttribute(UtilFuncoes.LOCALE_ESCOLHIDO) != null){
			
			mapaLinguagem = (Map<String,String>) sessao.getAttribute(UtilFuncoes.MAPA_LINGUAGEM_ESCOLHIDO);
			mapaLinguagemJson = (JSONObject) sessao.getAttribute(UtilFuncoes.MAPA_LINGUAGEM_ESCOLHIDO_JSON);

			
		}
		//quando o usuário ainda não tiver clicado em uma das bandeiras, ou seja, nesse momento será mantido o locale
		//do navegador do usuário
		else{
		
			Locale localeUsuario = request.getLocale();
		
		
			//Neste ponto o usuário já está usando o sitema e está a partir da segunda requisição
			if(sessao.getAttribute(UtilFuncoes.LOCALE_NAVEGADOR) != null){
			
				Locale localeSessao = (Locale) sessao.getAttribute(UtilFuncoes.LOCALE_NAVEGADOR);
			
				if(localeSessao.getLanguage().trim().equalsIgnoreCase(localeUsuario.getLanguage().trim()) && 
					localeSessao.getCountry().trim().equalsIgnoreCase(localeUsuario.getCountry().trim())){
				
					mapaLinguagem = (Map<String,String>) sessao.getAttribute(UtilFuncoes.MAPA_LINGUAGEM);
					mapaLinguagemJson = (JSONObject) sessao.getAttribute(UtilFuncoes.MAPA_LINGUAGEM_JSON);

				}
				//Cairá aqui quando o locale do usuário for diferente do locale da sessão
				else{
				
					mapaLinguagem = UtilFuncoes.buscarLinguagem(localeUsuario);
					mapaLinguagemJson = UtilFuncoes.buscarLinguagemJson(localeUsuario);
				
					//Armazena as informações do usuario em cache e evitar uma nova busca no arquivo de internacionalização
					sessao.setAttribute(UtilFuncoes.LOCALE_NAVEGADOR, localeUsuario);
					sessao.setAttribute(UtilFuncoes.MAPA_LINGUAGEM, mapaLinguagem);
					sessao.setAttribute(UtilFuncoes.MAPA_LINGUAGEM_JSON, mapaLinguagemJson);
				}
				
			
			}

			//Neste ponto o usuario está acessando o sitema pela primeira vez, ou seja, é a primeira requisição
			else{
			
				mapaLinguagem = UtilFuncoes.buscarLinguagem(localeUsuario);
				mapaLinguagemJson = UtilFuncoes.buscarLinguagemJson(localeUsuario);

			
				//Armazena as informações do usuario em cache e evitar uma nova busca no arquivo de internacionalização
				sessao.setAttribute(UtilFuncoes.LOCALE_NAVEGADOR, localeUsuario);
				sessao.setAttribute(UtilFuncoes.MAPA_LINGUAGEM, mapaLinguagem);
				sessao.setAttribute(UtilFuncoes.MAPA_LINGUAGEM_JSON, mapaLinguagemJson);

			}
	    }
		

		request.setAttribute("msgs", mapaLinguagem);
		request.setAttribute("msgsJson", mapaLinguagemJson.toString());
	}

}
